﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows;
using System.Collections.Specialized;
using System.Configuration;
using System.Net;
using System.Xml;
using MAnt3.Properties;
using MAntLibrary;

namespace MAnt3
{
    public class Konfigurace
    {
        
        #region TRIDNI PROMENNE
        private string ftp1User;
        public string Ftp1User
        {
            set { ftp1User = value.Trim(); }
            get { return ftp1User; }
        }

        private string ftp1Psw;
        public string Ftp1Psw
        {
            set { ftp1Psw = value.Trim(); }
            get { return ftp1Psw; }
        }

        private string ftp1Host;
        public string Ftp1Host
        {
            set { ftp1Host = value.Trim(); }
            get { return ftp1Host; }
        }

        private string ftp1PathXml;
        public string Ftp1PathXml
        {
            set { ftp1PathXml = value; }
            get { return ftp1PathXml; }
        }

        private string ftp1PathPictures;
        public string Ftp1PathPictures
        {
            set { ftp1PathPictures = value; }
            get { return ftp1PathPictures; }
        }

        private string uzivatel;
        public string Uzivatel
        {
            set { uzivatel = value; }
            get { return uzivatel; }
        }

        private string verze;
        public string Verze
        {
            set { verze = value; }
            get { return verze; }
        }

        private string mant;
        public string MAnt
        {
            set { mant = value; }
            get { return mant; }
        }

        private string ftp2user;
        public string Ftp2user
        {
            set { ftp2user = value; }
            get { return ftp2user; }
        }

        private string ftp2psw;
        public string Ftp2psw
        {
            set { ftp2psw = value; }
            get { return ftp2psw; }
        }

        private string ftp2host;
        public string Ftp2Host
        {
            set { ftp2host = value; }
            get { return ftp2host; }
        }

        private string mantInfoFile;
        public string MAntInfoFile
        {
            set { mantInfoFile = value; }
            get { return mantInfoFile; }
        }

        private string ftp2datapath;
        public string Ftp2datapath
        {
            set { ftp2datapath = value; }
            get { return ftp2datapath; }
        }

        private string aplikaceId;
        public string AplikaceId
        {
            set { aplikaceId = value; }
            get { return aplikaceId; }
        }

        private string mantsettingspath;
        public string MantSettingsPath
        {
            set { mantsettingspath = value; }
            get { return mantsettingspath; }
        }

        private string mantCestaKdb;
        public string MantCestaKdb
        {
            set { mantCestaKdb = value; }
            get { return mantCestaKdb; }
        }

        private string mantCestaKparovani;
        public string MantCestaKparovani
        {
            set { mantCestaKparovani = value; }
            get { return mantCestaKparovani; }
        }

        private string typAplikace;
        public string TypAplikace
        {
            set;
            get;
        }
        #endregion

        #region KONSTRUKTORY
        public Konfigurace()
        {
            // nactu konfiguraci
            nactiKonfiguraci();

            // zkontroluju konfiguraci
            overNastaveneHodnoty();

            // overim platnost licence
            platnostLicence(AplikaceId);
        }
        #endregion

        #region METODY
        /// <summary>
        /// mapuje app.config na tridni promenne 
        /// </summary>
        public void nactiKonfiguraci()
        {
            // nactu data z app.config
            Ftp1User = Settings.Default.ftp1USER;
            Ftp1Psw = Settings.Default.ftp1PSW;
            Ftp1Host = Settings.Default.ftp1HOST;
            Ftp1PathXml = Settings.Default.ftp1PATHXML;
            Ftp1PathPictures = Settings.Default.ftp1PATHPICTURES;
            Uzivatel = Settings.Default.uzivatel;
            Verze = Settings.Default.verze;
            MAnt = Settings.Default.MAnt;
            Ftp2user = Settings.Default.ftp2USER;
            Ftp2psw = Settings.Default.ftp2PSW;
            Ftp2Host = Settings.Default.ftp2HOST;
            Ftp2datapath = Settings.Default.ftp2PATHDATA;
            MAntInfoFile = Settings.Default.ftp2ConfigureFile;
            AplikaceId = Settings.Default.aplikaceID;
            TypAplikace = Settings.Default.typAplikace;

            // nastavim defaultni hodnoty
            MantSettingsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\MAnt\";
            MantCestaKdb = @"db\";
            MantCestaKparovani = @"parovani\";

            // specialni promenne
            Dodavatel.setDodavatele(Settings.Default.dodavatele);
            Kategorie.setKategorie( Settings.Default.kategorie );
        }
        
        /// <summary>
        /// ulozi nastavene hodnoty do app.config
        /// </summary>
        public void ulozKonfiguraci()
        {
            Settings.Default.ftp1USER = Ftp1User;
            Settings.Default.ftp1PSW = Ftp1Psw;
            Settings.Default.ftp1PATHXML = Ftp1PathXml;
            Settings.Default.ftp1PATHPICTURES = Ftp1PathPictures;
            Settings.Default.ftp1HOST = Ftp1Host;
            
            Settings.Default.MAnt = MAnt;
            Settings.Default.kategorie = Kategorie.getKategorie();
            Settings.Default.dodavatele = Dodavatel.getDodavatele(true);

            //Settings.Default.man
            Settings.Default.MAntSettingsPath = MAntInfoFile;

            Settings.Default.cestaKdb = MantCestaKdb;
            Settings.Default.cestaKparovani = MantCestaKparovani;

            // ulozim zmeny v Settings
            Settings.Default.Save();
        }

        /// <summary>
        /// kontroluje, zda-li jsou nastaveny dulezite udaje pro chod programu
        /// </summary>
        private void overNastaveneHodnoty()
        {
            // overim jestli jsou vyplnene dulezite konfiguracni udaje
            if ( string.IsNullOrEmpty(Ftp1Host) ||
                 string.IsNullOrEmpty(Ftp1PathPictures) ||
                 string.IsNullOrEmpty(Ftp1PathXml) ||
                 string.IsNullOrEmpty(Ftp1Psw) ||
                 string.IsNullOrEmpty(Ftp1User) ||
                 Kategorie.getKategorie(true).Count == 0 ||
                 Dodavatel.getDodavatele().Count ==0 )
            {
                MessageBox.Show("Nejsou nastaveny důležité hodnoty nastavení", "Upozornění", MessageBoxButton.OK);
                // zobrazit okno moznosti
            }
            
        }

        /// <summary>
        /// pripojuje se k FTP a zjistuje informace o platnosti aplikace ze souboru MAntInfo.xml
        /// </summary>
        /// <param name="aplikaceID">ID</param>
        public void platnostLicence(string aplikaceID)
        {
            string userName = Environment.UserName;
            string usersComputerName = Environment.MachineName;
            string IPadresa = Dns.Resolve(Dns.GetHostName()).AddressList[0].ToString();

            // stahnu soubor MAntInfo.xml
            string path = Ftp2Host + Ftp2datapath + MAntInfoFile;

            try
            {
                WebClient request = new WebClient();
                request.Credentials = new NetworkCredential(Ftp2user, Ftp2psw);
                byte[] fileData = request.DownloadData(path);

                // stazeny soubor ulozim na disk
                FileStream file = File.Create(MAntInfoFile);
                file.Write(fileData, 0, fileData.Length);
                file.Close();
            }
            catch (Exception e)
            {
                // smazani souboru
                IOproudy.smazaniSouboru(MAntInfoFile);
                return;
            }


            // nyni musim soubor MantInfo.xml precist a najit zaznam s ID aplikaceID
            string TEMPid, TEMPidAplikace, TEMPIPadresa, TEMPuserName, TEMPuserComputerName, TEMPdatumSplatnosti = string.Empty;
            XmlDocument doc = new XmlDocument();

            try { doc.Load(MAntInfoFile); }
            catch (Exception e)
            {
                // smazani souboru
                IOproudy.smazaniSouboru(MAntInfoFile);
                return;
            }

            XmlNode root = doc.DocumentElement;

            foreach (XmlNode childern in root.ChildNodes)
            {
                if (childern.Name.Equals("APP") && childern.Attributes["idAplikace"].Value.Equals(aplikaceID))
                {
                    TEMPid = childern.Attributes["id"].Value;
                    TEMPidAplikace = childern.Attributes["idAplikace"].Value;
                    TEMPIPadresa = childern.Attributes["IPadresa"].Value;
                    TEMPuserName = childern.Attributes["userName"].Value;
                    TEMPuserComputerName = childern.Attributes["userComputerName"].Value;
                    TEMPdatumSplatnosti = childern.Attributes["datumPlatnosti"].Value;

                    // nyni zjistim podle hodnoty TEMPIPadresa jestli se aplikace pripojuje poprve nebo se jiz drive pripojila

                    // aplikace se pripojila poprve
                    if ( string.IsNullOrEmpty( TEMPIPadresa ))
                    {
                        // nyni staci do xml souboru zapsat hodnoty IPadresa, userName, userComputerName a soubor nahrat zpet na FTP
                        childern.Attributes["IPadresa"].Value = IPadresa;
                        childern.Attributes["userName"].Value = userName;
                        childern.Attributes["userComputerName"].Value = usersComputerName;

                        try { doc.Save(MAntInfoFile); }
                        catch
                        {
                            // smazani souboru
                            IOproudy.smazaniSouboru(MAntInfoFile);
                            return;
                        }

                        // soubor nahraju zpet na FTP
                        try
                        {
                            FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(path);
                            ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
                            ftpRequest.Credentials = new NetworkCredential(Ftp2user, Ftp2psw);

                            Stream ftpStream = ftpRequest.GetRequestStream();
                            FileStream f = File.OpenRead(MAntInfoFile);
                            int length = 1024;
                            byte[] buffer = new byte[length];
                            int bytesRead = 0;

                            do
                            {
                                bytesRead = f.Read(buffer, 0, length);
                                ftpStream.Write(buffer, 0, bytesRead);
                            }
                            while (bytesRead != 0);

                            f.Close();
                            ftpStream.Close();
                        }
                        catch (Exception)
                        {
                            // smazani souboru
                            IOproudy.smazaniSouboru(MAntInfoFile);
                            return;
                        }
                        finally
                        {
                            // smazani souboru
                            IOproudy.smazaniSouboru(MAntInfoFile);
                        }
                    }

                    // aplikace se jiz drive pripojila
                    else
                    {
                        // pokud se idAplikace, IPadresa, userName, userComputerName neshoduji,
                        // jedna se o kopii programu a ukoncim ho
                        if (userName != TEMPuserName ||
                            usersComputerName != TEMPuserComputerName ||
                            IPadresa != TEMPIPadresa)
                        {
                            // zmenim hodnotu platnost v souboru app.config na kopie
                            MAnt = "k";
                            IOproudy.smazaniSouboru(MAntInfoFile);
                            MainWindow.preruseno = true;
                        }
                        // nejedna se o kopie, je potreba zkontrolovat datum
                        // a proverit dobu expirace
                        else
                        {
                            // zjistim kdy byla naposled aktualizovana stranka SEZNAMU a pouziji to jako aktualni datum
                            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.seznam.cz");
                            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
                            string AD = res.LastModified.ToString();
                            DateTime nactenyDatum = Convert.ToDateTime(TEMPdatumSplatnosti);
                            DateTime aktualniDatum = Convert.ToDateTime(AD);

                            // aplikace je vporadku
                            if (aktualniDatum.CompareTo(nactenyDatum) < 0)
                            {
                                MAnt = "a";
                                IOproudy.smazaniSouboru(MAntInfoFile);
                                return;
                            }
                            // aplikaci vyprsela platnost
                            else
                            {
                                MAnt = "n";
                                IOproudy.smazaniSouboru(MAntInfoFile);
                            }
                        }
                    }

                    // ukoncim cyklus prohledavani souboru MAntInfo.xml protoze shoda v souboru muze byt pouze jedna
                    break;
                }
            }
        }

        /// <summary>
        /// kontroluje jestli ma aplikace platnou licenci
        /// </summary>
        /// <returns>vraci true pokud aplikaci vyprsela licence</returns>
        public bool kontrola()
        {
            if (MAnt.Equals("n"))
            {
                MessageBox.Show("Aplikaci vypršela doba platnosti.\nPro více informací navštivte www.hromek.cz nebo pište na hromek@hotmail.cz", "Upozornění", MessageBoxButton.OK);
                return true;
            }
            else if (MAnt.Equals("k"))
            {
                MessageBox.Show("Aplikace byla spuštěna jako nelegální kopie a bude ukončena.", "Upozornění", MessageBoxButton.OK);
                return true;
            }

            // vsechno vporadku
            return false;
        }
        #endregion

        public object settings { get; set; }
    }
}
